package com.tjetc;

public class _17PolymorphicDetatil {
    public static void main(String[] args) {
        /*
            多态细节：
            多态的向上转型：
            a. 本质：⽗类的引⽤指向了⼦类的对象
            b. 语法：⽗类类型 引⽤名 = new ⼦类类型();
            c. 特点：编译类型看左边，运⾏类型看右边。
                可以调⽤⽗类中的所有成员(需遵守访问权限) 不能调⽤⼦类中特有成员；
                ⽅法最终运⾏效果看⼦类的具体实现。
            多态的向下转型：为了调用子类特有的方法
                a. 语法：⼦类类型 引⽤名 = (⼦类类型) ⽗类引⽤；
                b. 只能强转⽗类的引⽤，不能强转⽗类的对象（在堆中的对象是没有办法改变的。）
                c. 要求⽗类的引⽤必须指向的是当前⽬标类型的对象
                d. 当向下转型后，可以调⽤⼦类类型中所有的成员

            注意：向下转型有风险，一定要判断 使用关键字instanceof
         */

        // 向上转型
        Animal dog = new Dog();
        dog.f();
//        dog.f1();
        // java.lang.ClassCastException: 会发生转换异常
        // 🐶是动物 这只动物是只🐶 但是🐶变不了🐱

        if (dog instanceof Cat) {
            Cat cat = (Cat) dog;
        }

        Dog dog1 = (Dog) dog;
        dog1.f1();



    }
}


class Animal {
    void f(){
        System.out.println("父类执行");
    }
}

class Cat extends Animal {

}

class Dog extends Animal{
    void f1(){}

    @Override
    void f() {
        System.out.println("子类执行");
    }
}



